"""
监控 API

提供系统性能监控、健康检查等端点。
"""
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from app.api.deps import get_db, get_current_user
from app.models.user import User
from app.middleware.performance_monitor import performance_stats
import psutil
import os
from datetime import datetime

router = APIRouter(prefix="/monitoring", tags=["monitoring"])


@router.get("/health")
async def health_check():
    """
    健康检查
    
    用于负载均衡器或监控系统检查服务是否正常运行。
    
    Returns:
        dict: 健康状态信息，包括：
            - status: "ok" 表示服务正常
            - timestamp: 当前时间戳
    
    Examples:
        >>> # curl http://localhost:3301/api/monitoring/health
        >>> {"status": "ok", "timestamp": "2024-01-01T12:00:00"}
    """
    return {
        "status": "ok",
        "timestamp": datetime.utcnow().isoformat()
    }


@router.get("/stats")
async def get_performance_stats(current_user: User = Depends(get_current_user)):
    """
    获取性能统计
    
    返回系统运行以来的性能统计信息，仅管理员可访问。
    
    Args:
        current_user: 当前登录用户（必须是管理员）
    
    Returns:
        dict: 性能统计信息，包括：
            - total_requests: 总请求数
            - avg_response_time: 平均响应时间
            - max_response_time: 最大响应时间
            - min_response_time: 最小响应时间
            - slow_requests: 慢请求数
            - error_requests: 错误请求数
            - uptime: 运行时间
    
    Raises:
        HTTPException(403): 如果用户不是管理员
    """
    from fastapi import HTTPException
    
    # 只允许管理员访问
    if current_user.role != "admin":
        raise HTTPException(status_code=403, detail="权限不足")
    
    return performance_stats.get_summary()


@router.post("/stats/reset")
async def reset_performance_stats(current_user: User = Depends(get_current_user)):
    """
    重置性能统计
    
    清除当前的性能统计数据，重新开始统计。仅管理员可操作。
    
    Args:
        current_user: 当前登录用户（必须是管理员）
    
    Returns:
        dict: 操作结果消息
    
    Raises:
        HTTPException(403): 如果用户不是管理员
    """
    from fastapi import HTTPException
    
    if current_user.role != "admin":
        raise HTTPException(status_code=403, detail="权限不足")
    
    performance_stats.reset()
    return {"message": "性能统计已重置"}


@router.get("/system")
async def get_system_info(current_user: User = Depends(get_current_user)):
    """
    获取系统信息
    
    返回服务器的硬件和运行状态信息，仅管理员可访问。
    
    Args:
        current_user: 当前登录用户（必须是管理员）
    
    Returns:
        dict: 系统信息，包括：
            - cpu_percent: CPU 使用率（%）
            - memory_percent: 内存使用率（%）
            - memory_used: 已用内存（GB）
            - memory_total: 总内存（GB）
            - disk_percent: 磁盘使用率（%）
            - disk_used: 已用磁盘空间（GB）
            - disk_total: 总磁盘空间（GB）
            - process_id: 进程 ID
    
    Raises:
        HTTPException(403): 如果用户不是管理员
    """
    from fastapi import HTTPException
    
    if current_user.role != "admin":
        raise HTTPException(status_code=403, detail="权限不足")
    
    # CPU 使用率
    cpu_percent = psutil.cpu_percent(interval=1)
    
    # 内存信息
    memory = psutil.virtual_memory()
    memory_used_gb = memory.used / (1024 ** 3)
    memory_total_gb = memory.total / (1024 ** 3)
    
    # 磁盘信息
    disk = psutil.disk_usage('/')
    disk_used_gb = disk.used / (1024 ** 3)
    disk_total_gb = disk.total / (1024 ** 3)
    
    return {
        "cpu_percent": cpu_percent,
        "memory_percent": memory.percent,
        "memory_used": round(memory_used_gb, 2),
        "memory_total": round(memory_total_gb, 2),
        "disk_percent": disk.percent,
        "disk_used": round(disk_used_gb, 2),
        "disk_total": round(disk_total_gb, 2),
        "process_id": os.getpid()
    }


@router.get("/database")
async def get_database_stats(
    current_user: User = Depends(get_current_user),
    db: Session = Depends(get_db)
):
    """
    获取数据库统计
    
    返回数据库的表数量、记录数等统计信息，仅管理员可访问。
    
    Args:
        current_user: 当前登录用户（必须是管理员）
        db: 数据库会话
    
    Returns:
        dict: 数据库统计信息，包括各表的记录数
    
    Raises:
        HTTPException(403): 如果用户不是管理员
    """
    from fastapi import HTTPException
    
    if current_user.role != "admin":
        raise HTTPException(status_code=403, detail="权限不足")
    
    try:
        from app.models.user import User as UserModel
        from app.models.document import Document
        from app.models.note import Note
        from app.models.knowledge_base import KnowledgeBase
        from app.models.category import Category
        from app.models.chat import ChatSession
        
        return {
            "users": db.query(UserModel).count(),
            "documents": db.query(Document).count(),
            "notes": db.query(Note).count(),
            "knowledge_bases": db.query(KnowledgeBase).count(),
            "categories": db.query(Category).count(),
            "chat_sessions": db.query(ChatSession).count()
        }
    except Exception as e:
        import logging
        logging.error(f"Database stats error: {str(e)}")
        raise HTTPException(status_code=500, detail=f"获取数据库统计失败: {str(e)}")

